home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 6 / CU Amiga Magazine's Super CD-ROM 06 (1996)(EMAP Images)(GB)(Track 1 of 4)[!][issue 1997-01].iso / cucd / prog / mui / modula / txt / muiclasses.mod < prev    next >
Text File  |  1996-08-14  |  9KB  |  352 lines

  1. IMPLEMENTATION MODULE MuiClasses;
  2.  
  3. (***************************************************************************
  4. **
  5. ** $VER: MuiClasses.mod 3.6 (13.8.96)
  6. **
  7. ** The following updates have been done by
  8. **
  9. **   Olaf "Olf" Peters <olf@informatik.uni-bremen.de>
  10. **
  11. ** $HISTORY:
  12. **
  13. **  13.8.96  3.6   : updated for MUI 3.6 release
  14. **  21.2.96  3.3   : updated for MUI 3.3 release
  15. **  23.1.96  3.2   : updated for MUI 3.2 release
  16. ** 18.11.95  3.1   : updated for MUI 3.1 release
  17. **
  18. ***************************************************************************)
  19.  
  20. (*************************************************************************
  21. ** Structures and Macros for creating MUI custom classes.
  22. **
  23. ** converted for M2 by Christian 'Kochtopf' Scholz
  24. **
  25. **************************************************************************
  26. **
  27. ** $Id: MuiClasses.mod,v 1.10 1996/08/14 23:23:49 olf Exp olf $
  28. **
  29. **************************************************************************)
  30.  
  31. FROM    SYSTEM      IMPORT CAST, ADR, BYTE, ADDRESS, REG, SETREG, ASSEMBLE;
  32. FROM    MuiD        IMPORT APTR;
  33.  
  34. IMPORT
  35.   ed : ExecD,
  36.   gd : GraphicsD,
  37.   id : IntuitionD,
  38.   ud : UtilityD,
  39.   R;
  40.  
  41. (*
  42. ** first some general BOOPSI-things, which aren't defined in the normal defs.
  43. *)
  44.  
  45. TYPE    object = RECORD
  46.                     oNode   : ed.MinNode;
  47.                     oClass  : id.IClassPtr;
  48.                  END;
  49.  
  50. (* get a pointer to our instance data *)
  51.  
  52. PROCEDURE InstData(cl : id.IClassPtr; obj : id.ObjectPtr) : ADDRESS;
  53.     BEGIN
  54.         RETURN (CAST(ADDRESS, obj) + ADDRESS(cl^.instOffset));
  55.     END InstData;
  56.  
  57. (* get the size ... *)
  58.  
  59. PROCEDURE InstSize(cl : id.IClassPtr) : CARDINAL;
  60.     BEGIN
  61.         RETURN cl^.instOffset+cl^.instSize+SIZE(object);
  62.     END InstSize;
  63.  
  64.  
  65. (* 
  66. ** something, which we can cast your object-pointer to
  67. ** (just used iternally)
  68. *)
  69.  
  70. TYPE    dummyXFC = RECORD
  71.                     mnd : mNotifyData;
  72.                     mad : mAreaData;
  73.                    END;
  74.  
  75.         dummyXFCPtr = POINTER TO dummyXFC;
  76.  
  77.  
  78. (*
  79. ** now the functions to get to some types of data of our object.
  80. *)
  81.  
  82. PROCEDURE muiPen(pen : LONGCARD) : LONGCARD;
  83. VAR
  84.   ret{R.D4} : LONGCARD;
  85. BEGIN
  86.     ASSEMBLE(
  87.       MOVE.L pen(A5), D4
  88.       AND.L  #muipenMask, D4
  89.     END) ;
  90.     RETURN ret ;
  91. END muiPen ;
  92.  
  93. PROCEDURE muiNotifyData(obj : APTR) : mNotifyDataPtr;
  94.     BEGIN
  95.         RETURN ADR(CAST(dummyXFCPtr, obj)^.mnd);
  96.     END muiNotifyData;
  97.  
  98. PROCEDURE muiAreaData(obj : APTR) : mAreaDataPtr;
  99.     BEGIN
  100.         RETURN ADR(CAST(dummyXFCPtr, obj)^.mad);
  101.     END muiAreaData;
  102.  
  103. PROCEDURE muiGlobalInfo(obj : APTR) : mGlobalInfoPtr;
  104.     BEGIN
  105.         RETURN CAST(dummyXFCPtr, obj)^.mnd.mndGlobalInfo;
  106.     END muiGlobalInfo;
  107.  
  108. PROCEDURE muiUserData(obj : APTR) : ADDRESS ;
  109.     BEGIN
  110.         RETURN CAST(dummyXFCPtr, obj)^.mnd.mndUserData;
  111.     END muiUserData;
  112.  
  113. PROCEDURE muiRenderInfo(obj : APTR) : mRenderInfoPtr;
  114.     BEGIN
  115.         RETURN CAST(dummyXFCPtr, obj)^.mad.madRenderInfo;
  116.     END muiRenderInfo;
  117.  
  118.  
  119. (*
  120. ** here the macros from mui.h.
  121. ** use them to get e.g. your rastport.
  122. *)
  123.  
  124. PROCEDURE OBJ_app(obj : APTR) : id.ObjectPtr;
  125.     BEGIN
  126.         RETURN muiGlobalInfo(obj)^.mgiApplicationObject;
  127.     END OBJ_app;
  128.  
  129. PROCEDURE OBJ_win(obj : APTR) : id.ObjectPtr;
  130.     BEGIN
  131.         RETURN muiRenderInfo(obj)^.mriWindowObject;
  132.     END OBJ_win;
  133.  
  134. PROCEDURE OBJ_dri(obj : APTR) : id.DrawInfoPtr;
  135.     BEGIN
  136.         RETURN muiRenderInfo(obj)^.mriDrawInfo;
  137.     END OBJ_dri;
  138.  
  139. PROCEDURE OBJ_screen(obj : APTR) : id.ScreenPtr;
  140.     BEGIN
  141.         RETURN muiRenderInfo(obj)^.mriScreen;
  142.     END OBJ_screen;
  143.  
  144. PROCEDURE OBJ_pens(obj : APTR) : mPensPtr;
  145.     BEGIN
  146.         RETURN muiRenderInfo(obj)^.mriPens;
  147.     END OBJ_pens;
  148.  
  149. PROCEDURE OBJ_window(obj : APTR) : id.WindowPtr;
  150.     BEGIN
  151.         RETURN muiRenderInfo(obj)^.mriWindow;
  152.     END OBJ_window;
  153.  
  154. PROCEDURE OBJ_rp(obj : APTR) : gd.RastPortPtr;
  155.     BEGIN
  156.         RETURN muiRenderInfo(obj)^.mriRastPort;
  157.     END OBJ_rp;
  158.  
  159. PROCEDURE OBJ_left(obj : APTR) : INTEGER;
  160.     BEGIN
  161.         RETURN muiAreaData(obj)^.madBox.left;
  162.     END OBJ_left;
  163.  
  164. PROCEDURE OBJ_top(obj : APTR) : INTEGER;
  165.     BEGIN
  166.         RETURN muiAreaData(obj)^.madBox.top;
  167.     END OBJ_top;
  168.  
  169. PROCEDURE OBJ_width(obj : APTR) : INTEGER;
  170.     BEGIN
  171.         RETURN muiAreaData(obj)^.madBox.width;
  172.     END OBJ_width;
  173.  
  174. PROCEDURE OBJ_height(obj : APTR) : INTEGER;
  175.     BEGIN
  176.         RETURN muiAreaData(obj)^.madBox.height;
  177.     END OBJ_height;
  178.  
  179. PROCEDURE OBJ_right(obj : APTR) : INTEGER;
  180.     BEGIN
  181.         RETURN OBJ_left(obj)+OBJ_width(obj)-1;
  182.     END OBJ_right;
  183.  
  184. PROCEDURE OBJ_bottom(obj : APTR) : INTEGER;
  185.     BEGIN
  186.         RETURN OBJ_top(obj)+OBJ_height(obj)-1;
  187.     END OBJ_bottom;
  188.  
  189. PROCEDURE OBJ_addleft(obj : APTR) : INTEGER;
  190.     BEGIN
  191.         RETURN INTEGER(muiAreaData(obj)^.madAddLeft);
  192.     END OBJ_addleft;
  193.  
  194. PROCEDURE OBJ_addtop(obj : APTR) : INTEGER;
  195.     BEGIN
  196.         RETURN INTEGER(muiAreaData(obj)^.madAddTop);
  197.     END OBJ_addtop;
  198.  
  199. PROCEDURE OBJ_subwidth(obj : APTR) : INTEGER;
  200.     BEGIN
  201.         RETURN INTEGER(muiAreaData(obj)^.madSubWidth);
  202.     END OBJ_subwidth;
  203.  
  204. PROCEDURE OBJ_subheight(obj : APTR) : INTEGER;
  205.     BEGIN
  206.         RETURN INTEGER(muiAreaData(obj)^.madSubHeight);
  207.     END OBJ_subheight;
  208.  
  209. PROCEDURE OBJ_mleft(obj : APTR) : INTEGER;
  210.     BEGIN
  211.         RETURN OBJ_left(obj)+OBJ_addleft(obj);
  212.     END OBJ_mleft;
  213.  
  214. PROCEDURE OBJ_mtop(obj : APTR) : INTEGER;
  215.     BEGIN
  216.         RETURN OBJ_top(obj)+OBJ_addtop(obj);
  217.     END OBJ_mtop;
  218.  
  219. PROCEDURE OBJ_mwidth(obj : APTR) : INTEGER;
  220.     BEGIN
  221.         RETURN OBJ_width(obj)-OBJ_subwidth(obj);
  222.     END OBJ_mwidth;
  223.  
  224. PROCEDURE OBJ_mheight(obj : APTR) : INTEGER;
  225.     BEGIN
  226.         RETURN OBJ_height(obj)-OBJ_subheight(obj);
  227.     END OBJ_mheight;
  228.  
  229. PROCEDURE OBJ_mright(obj : APTR) : INTEGER;
  230.     BEGIN
  231.         RETURN OBJ_mleft(obj)+OBJ_mwidth(obj)-1;
  232.     END OBJ_mright;
  233.  
  234. PROCEDURE OBJ_mbottom(obj : APTR) : INTEGER;
  235.     BEGIN
  236.         RETURN OBJ_mtop(obj)+OBJ_mheight(obj)-1;
  237.     END OBJ_mbottom;
  238.  
  239. PROCEDURE OBJ_font(obj : APTR) : gd.TextFontPtr;
  240.     BEGIN
  241.         RETURN muiAreaData(obj)^.madFont;
  242.     END OBJ_font;
  243.  
  244. PROCEDURE OBJ_minwidth(obj : APTR) : CARDINAL;
  245.     BEGIN
  246.         RETURN muiAreaData(obj)^.madMinMax.MinWidth;
  247.     END OBJ_minwidth;
  248.  
  249. PROCEDURE OBJ_minheight(obj : APTR) : CARDINAL;
  250.     BEGIN
  251.         RETURN muiAreaData(obj)^.madMinMax.MinHeight;
  252.     END OBJ_minheight;
  253.  
  254. PROCEDURE OBJ_maxwidth(obj : APTR) : CARDINAL;
  255.     BEGIN
  256.         RETURN muiAreaData(obj)^.madMinMax.MaxWidth;
  257.     END OBJ_maxwidth;
  258.  
  259. PROCEDURE OBJ_maxheight(obj : APTR) : CARDINAL;
  260.     BEGIN
  261.         RETURN muiAreaData(obj)^.madMinMax.MaxHeight;
  262.     END OBJ_maxheight;
  263.  
  264. PROCEDURE OBJ_defwidth(obj : APTR) : CARDINAL;
  265.     BEGIN
  266.         RETURN muiAreaData(obj)^.madMinMax.DefWidth;
  267.     END OBJ_defwidth;
  268.  
  269. PROCEDURE OBJ_defheight(obj : APTR) : CARDINAL;
  270.     BEGIN
  271.         RETURN muiAreaData(obj)^.madMinMax.DefHeight;
  272.     END OBJ_defheight;
  273.  
  274. PROCEDURE OBJ_flags(obj : APTR) : MADFlagSet;
  275.     BEGIN
  276.         RETURN muiAreaData(obj)^.madFlags;
  277.     END OBJ_flags;
  278.  
  279.  
  280. (*
  281. ** here are some new procedures to generate dispatchers which restore A4
  282. *)
  283.  
  284. (* first the 'real' dispatcher *)
  285.  
  286. PROCEDURE DispatchEntry(class{R.A0} : ud.HookPtr;
  287.                         object{R.A2}: ADDRESS;
  288.                         msg{R.A1}   : ADDRESS)     : ADDRESS;
  289.     (*$SaveA4:=TRUE*)
  290.     BEGIN
  291.         SETREG (R.A4, CAST(id.IClassPtr,class)^.userData);
  292.         RETURN CAST(DispatcherDef,CAST(id.IClassPtr,class)^.dispatcher.subEntry)(CAST(id.IClassPtr,class), object, msg);
  293.     END DispatchEntry;
  294.  
  295. (* fill the dispatcher-record inside the class *)
  296.  
  297. PROCEDURE MakeDispatcher(entry:DispatcherDef; myclass : id.IClassPtr);
  298.  
  299.     BEGIN
  300.             myclass^.dispatcher.node.succ  := NIL;
  301.             myclass^.dispatcher.node.pred  := NIL;
  302.             myclass^.dispatcher.entry      := DispatchEntry;
  303.             myclass^.dispatcher.subEntry   := CAST(ADDRESS,entry);
  304.             myclass^.userData              := REG(R.A4);
  305.     END MakeDispatcher;
  306.  
  307.  
  308.  
  309. (* a useful PROCEDURE! *)
  310.  
  311. PROCEDURE FillMinMaxInfo (msg : mpAskMinMaxPtr; minWidth   : CARDINAL;
  312.                                                 defWidth   : CARDINAL;
  313.                                                 maxWidth   : CARDINAL;
  314.                                                 minHeight  : CARDINAL;
  315.                                                 defHeight  : CARDINAL;
  316.                                                 maxHeight  : CARDINAL);
  317.     BEGIN                                               
  318.  
  319.         WITH msg^.MinMaxInfo^ DO
  320.             INC(MinWidth, minWidth) ;
  321.             INC(DefWidth, defWidth) ;
  322.             INC(MaxWidth, maxWidth) ;
  323.  
  324.             INC(MinHeight, minHeight) ;
  325.             INC(DefHeight, defHeight) ;
  326.             INC(MaxHeight, maxHeight) ;
  327.  
  328.         END (* WITH *) ;
  329.     END FillMinMaxInfo;
  330.  
  331. (*
  332. ** 2 useful procedures for testing if some coordinates are inside your object
  333. ** (converted from the ones in class3.c. So look there how to use... )
  334. *)
  335.  
  336. PROCEDURE OBJ_between(a,x,b : INTEGER) : BOOLEAN;
  337.     BEGIN
  338.         RETURN ((x>=a) AND (x<=b));
  339.     END OBJ_between;
  340.  
  341. PROCEDURE OBJ_isInObject(x, y : INTEGER; obj : id.ObjectPtr) : BOOLEAN;
  342.     BEGIN
  343.         RETURN (OBJ_between(OBJ_mleft(obj), x, OBJ_mright(obj)) AND
  344.                 OBJ_between(OBJ_mtop(obj), y, OBJ_mbottom(obj)));
  345.     END OBJ_isInObject;
  346.  
  347.  
  348.  
  349.  
  350. END MuiClasses.
  351.  
  352.